home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / hexrev / crx / hexrev.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  6KB  |  246 lines

  1. /***************************************************
  2.  
  3.   hexrev.c : 六角リバーシゲームだよ
  4.  
  5.     Copyright (C) 1997 - 2000 by Makoto Hiroi
  6.  
  7.  
  8. -CRX ver 電魔団\shoryu 2000
  9.  
  10. ****************************************************/
  11. #include    "hexrev.h"
  12.  
  13. int        first_move = TRUE;        /* 人間側が先手(黒) */
  14. int        level = 1;                /* レベル */
  15. int        play_flag;                /* ゲーム中か */
  16.  
  17. int        C_RES_FREETURN=46;        /*@@中央リザーブが解放されるターン*/
  18. int        C_RES_WHO=BLACK;        /*@@生まれ変わりの予定*/
  19.  
  20.  
  21. /* 250 msec wait ルーチン */
  22. void wait( void )
  23. {
  24.     int        start = clock();
  25.     while( (clock() - start) < 25 );
  26. }
  27.  
  28. /* 終了 */
  29. volatile void quit( void )
  30. {
  31.     _iocs_crtmod( 16 );
  32.     _iocs_skey_mod( -1, 0, 0 );    /* ソフトウェアキーボード自動制御 */
  33.     _iocs_ms_curof();
  34.     _dos_c_fnkmod( 0 );
  35.     _dos_c_curon();
  36.     _dos_c_window( 0, 31 );
  37.     exit( 0 );
  38. }
  39.  
  40. /* メッセージ */
  41. typedef enum {
  42.     MOVE_COM, MOVE_HUMAN, BREAK, C_WIN, H_WIN, DRAW, THINK, PASS_M, NOT_PUT,
  43. } MES_CODE;
  44.  
  45. const char *mes_table[] = {
  46.     "わたしの手番です",
  47.     "あなたの手番です",
  48.     "対局を中断します",
  49.     "私の勝ちです  ",
  50.     "あなたの勝ちです",
  51.     "引き分けですね ",
  52.     "考えています・・",
  53.     "・・パスです・・",
  54.     "石は置けませんよ",
  55. };
  56.  
  57. /* メッセージ出力 */
  58. static void print_mes( int pos )
  59. {
  60.     _dos_c_locate( 22, 28 );
  61.     printf( "%s", mes_table[pos] );
  62.     fflush( stdout );
  63.     wait();
  64.     wait();
  65. }
  66.  
  67. /* 石を置く */
  68. static int put_piece( int num, int piece )
  69. {
  70.   char buffer[SIZE];
  71.   char *ptr = buffer;
  72.   int c = reverse_piece( num, piece, buffer );
  73.   if( c > 0 ){
  74.     draw_piece( num, piece );
  75.     wait();
  76.     while( *ptr != -1 ){
  77.       draw_piece( *ptr++, piece );
  78.       wait();
  79.     }
  80.   }
  81.   return c;
  82. }
  83.  
  84. /* マウス入力 */
  85. static int input_mouse( int piece )
  86. {
  87.   for(;;){
  88.     int        pos, x, y;
  89.     while( _iocs_ms_ontm( 0, 0 ) == 0 );    /* 左ボタンが押されるまで待つ */
  90.     pos = _iocs_ms_curgt();
  91.     while( _iocs_ms_offtm( 0, 0 ) == 0 );    /* ボタンが離されるのを待つ */
  92.     x = pos >> 16; y = pos & 0xffff;
  93.     if( (piece < FREE) &&
  94.         (x >= 48 && x < 466) && (y >= 48 && y < 466) ){
  95.       /* 駒を置く */
  96.       int n = get_postion( x, y );
  97.       if( n == -1 || put_piece( n, piece ) <= 0 ){
  98.         /* その場所には置けません */
  99.         print_mes( NOT_PUT );
  100.       } else {
  101.         return n;
  102.       }
  103.     } else if( y >= 480 ){  /* ステータスライン */
  104.       x = x / 64;
  105.       switch( x - 4 ){
  106.       case 0:        /* レベルの変更 */
  107.         if( ++level > 5 ) level = 1;
  108.         print_level();
  109.         break;
  110.       case 1:        /* 先手・後手の変更 */
  111.         if( play_flag == FALSE ){
  112.           first_move = (first_move ? FALSE : TRUE);
  113.           print_move();
  114.         }
  115.         break;
  116.       case 2:        /* 対局 */
  117.         return START;
  118.       case 3:        /* 終了 */
  119.         quit(); break;
  120.       }
  121.     }
  122.   }
  123. }
  124.  
  125.  
  126. /* ゲームの実行 */
  127. static void play( void )
  128. {
  129.   int    turn, move, human_piece, com_piece, value;
  130.   C_RES_FREETURN=(rand()%((SIZE-6)/2))+6;    /*@@中央解放タイミングの設定:前半折り返しまでに発生*/
  131.   C_RES_WHO=((rand()%100)>=50)?BLACK:WHITE;    /*@@*/
  132.   if( first_move ){
  133.     turn = HUMAN;
  134.     human_piece = BLACK; com_piece = WHITE;
  135.   } else {
  136.     turn = COM;
  137.     human_piece = WHITE; com_piece = BLACK;
  138.   }
  139.   for(;;){
  140.     if( getTurnNum()==C_RES_FREETURN ){    /*@@中央解放処理*/
  141.         setBoard(45,C_RES_WHO);
  142.         draw_piece( 45, C_RES_WHO );
  143.     }                    /*@@*/
  144.     if( turn == HUMAN ){
  145.       /* 人間側の指し手 */
  146.       print_mes( MOVE_HUMAN );
  147.       if( !check_move( human_piece ) ){
  148.         if( check_move( com_piece ) ){
  149.           /* パスです */
  150.           print_mes( PASS_M );
  151.         } else {
  152.           /* 終了です */
  153.           value = result_value( TRUE );
  154.           break;
  155.         }
  156.       } else {
  157.         if( (move = input_mouse( human_piece )) == START ){
  158.           /* 中断です */
  159.           print_mes( BREAK );
  160.           value = NO_VALUE;
  161.           break;
  162.         }
  163.       }
  164.       turn = COM;
  165.  
  166. #ifdef 0
  167.       if( (move = select_move( human_piece, level )) == PASS ){
  168.         if( check_move( com_piece ) ){
  169.           /* パスだよ */
  170.           print_mes( PASS_M );
  171.         } else {
  172.           /* 終了です */
  173.           value = result_value( TRUE );
  174.           break;
  175.         }
  176.       } else {
  177.         put_piece( move, human_piece );  /* 駒を置くよ */
  178.       }
  179.       turn = COM;
  180. #endif
  181.  
  182.     } else {
  183.       /* コンピュータ側の指し手 */
  184.       print_mes( MOVE_COM );
  185.       if( (move = select_move( com_piece, level )) == PASS ){
  186.         if( check_move( human_piece ) ){
  187.           /* パスだよ */
  188.           print_mes( PASS_M );
  189.         } else {
  190.           /* 終了です */
  191.           value = result_value( TRUE );
  192.           break;
  193.         }
  194.       } else {
  195.         put_piece( move, com_piece );    /* 駒を置くよ */
  196.       }
  197.       turn = HUMAN;
  198.     }
  199.     print_stones();
  200.     /* 終了判定 */
  201.     if( (value = result_value( FALSE )) != NO_VALUE ){
  202.       break;        /* 終了です */
  203.     }
  204.   }
  205.   if( value != NO_VALUE ){
  206.     if( value == 0 ){
  207.       print_mes( DRAW );
  208.     } else if( value > 0 ){
  209.       /* 黒の勝ち */
  210.       print_mes( (human_piece == BLACK ? H_WIN : C_WIN) );
  211.     } else {
  212.       /* 白の勝ち */
  213.       print_mes( (human_piece == WHITE ? H_WIN : C_WIN) );
  214.     }
  215.   }
  216. }
  217.  
  218. /* 初期化 */
  219. static void init_rev( void )
  220. {
  221.     srand( time( NULL ) );    /* 乱数の初期化 */
  222.     init_screen();            /* 画面の初期化 */
  223.     init_data();            /* データの初期化 */
  224.     _dos_c_cls_al();
  225. }
  226.  
  227.  
  228. /* メインルーチン */
  229. int main( int argc, char *argv[] )
  230. {
  231.     init_rev();
  232.     for(;;){
  233.         /* 対局が押されるまで待つ */
  234.         while( input_mouse( FREE ) != START );
  235.         init_data();
  236.         play_flag = TRUE;
  237.         play();                    /* ゲームの実行 */
  238.         play_flag = FALSE;
  239.     }
  240.     /* 終了は quit で行う */
  241.     return 0;
  242. }
  243.  
  244. /* end of file */
  245.  
  246.